﻿package com.PlantVsZombies.common;
/**
 * 僵尸类
 * 属性：	life：生命值
 * 			image：僵尸图片
 * 			row ： 僵尸位置横坐标
 * 			col：僵尸位置纵坐标
 * 			presentImage：当前照片
 * 			
 *  * 方法：包含方法体为空的run方法
 * 此方法实现僵尸移动，其他具体僵尸类需要重写此方法
 */
import java.awt.Graphics;
import java.awt.Image;
import java.io.Serializable;

public abstract class Zombie extends Life implements Comparable<Zombie>, Serializable{
	private int life;
	private Image image;
	private int row;
	private int col;
	private int speed;
	private boolean canRun = true;
	private boolean isLive = true;
	private boolean isAttack = false;
	public boolean hasHead = true;
	/*
	 * 构造方法，
	 * 初始化僵尸基本参数：row,col。
	 * speed,left，image【】将在子类构造方法中实现
	 * 并实现僵尸在原地踏步
	 */
	public Zombie(int row ,int col){
		this.row = row;
		this.col = col;
		
	}
	
	/*
	 * 在僵尸到达屋子以前，每次row递减参数speed像素
	 *此方法为线程服务 
	 */
	public void move(){
		if(this.getLife() > 0 && (this.getRow()) >=-10 && canRun)
		{
			this.setRow(this.getRow()-speed);
		}
	}
	/*
	 * 此方法传入参数Graphics g
	 * 实现把僵尸画入面板
	 * 每次只画当前僵尸的静态图片：presetImage；
	 */
	public void drawImage(Graphics g){
		
			g.drawImage(image, this.getRow(),this.getCol(), null);
		//else
			//g.drawImage(Zombie_StaticVar.boomdie, this.getRow(),this.getCol(), null);
	}
	/*
	 * 当生命值为0且已经死了，就从僵尸集合集合中移除
	 */
	public void remove(){
		//PlantsMap.zombies.remove(this);
		isLive = false;
	}
	/*
	 * 为更好的实现数据的封装，
	 * 方法的属性都定义为private类型，
	 * 此处为每种属性添加set和get方法
	 * 
	 */
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	
	public int getLife() {
		return life;
	}
	public void setLife(int life) {
		this.life = life;
	}
	public Image getImage() {
		return image;
	}
	public void setImage(Image image) {
		this.image = image;
	}
	public int getRow() {
		return row;
	}
	public void setRow(int row) {
		this.row = row;
	}
	public int getCol() {
		return col;
	}
	public void setCol(int col) {
		this.col = col;
	}
	
	public boolean getLive() {
		return isLive;
	}

	public void setLive(boolean isLive) {
		this.isLive = isLive;
	}

	public boolean isCanRun() {
		return canRun;
	}

	public void setCanRun(boolean canRun) {
		this.canRun = canRun;
	}

	public boolean isAttack() {
		return isAttack;
	}

	public void setAttack(boolean isAttack) {
		this.isAttack = isAttack;
	}

	/*
	 * 本类实现了接口Runable
	 * 此处实现接口抽象类。
	 * 此方法实现僵尸的移动
	 * 移动速度会根据speed做出调整，以适合僵尸移动的立体感
	 * (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */

	/*
	 * 本类实现接口Comparable
	 * 实现此接口并重写了compareTo（）方法后
	 * 本类对象的集合就可以使用工具类Collections的sort（）方法
	 * 比较的规则是：纵坐标的大小作为僵尸的大小
	 * 这样在画僵尸的时候可以先画上面的僵尸，给人以立体感
	 * (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	@Override
	public int compareTo(Zombie zmb) {
		// TODO Auto-generated method stub
		return this.getCol()-zmb.getCol();
	}

	/*
	 * 死亡线程
	 * 在死亡过后会停留1秒
	 */
	public class diedThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
				currentThread().sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			remove();
			return;
		}	
	}
}
